package com.ssy.lingxi.member.merchant.serviceimpl.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.config.ServiceConfig;
import com.ssy.lingxi.member.merchant.model.constant.MemberStringEnum;
import com.ssy.lingxi.member.merchant.model.dto.CountryAreaDTO;
import com.ssy.lingxi.member.merchant.model.vo.basic.request.CountryAreaCodeVO;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.CountryAreaCodeNameVO;
import com.ssy.lingxi.member.merchant.repository.CountryAreaRepository;
import com.ssy.lingxi.member.merchant.service.base.IBaseCountryAreaService;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 国家区域基础服务接口实现类
 * @author 万宁
 * @version 2.0.0
 * @date 2021-05-10
 */
@Service
public class BaseCountryAreaServiceImpl implements IBaseCountryAreaService {

    @Resource
    private CountryAreaRepository countryAreaRepository;

    /**
     * 查询省列表
     *
     * @return 查询结果
     */
    @Override
    public Wrapper<List<CountryAreaCodeNameVO>> listProvince() {
        return Wrapper.success(countryAreaRepository.findByParentCode(ServiceConfig.COUNTRY_AREA_TOP_CODE, Sort.by("code").ascending()).stream().map(countryAreaDO -> new CountryAreaCodeNameVO(countryAreaDO.getCode(), countryAreaDO.getName())).collect(Collectors.toList()));
    }

    /**
     * 根据省编码，查询市列表
     *
     * @param codeVO 接口参数
     * @return 查询结果
     */
    @Override
    public Wrapper<List<CountryAreaCodeNameVO>> listCitiesByProvinceCode(CountryAreaCodeVO codeVO) {
        return Wrapper.success(countryAreaRepository.findByParentCode(codeVO.getCode(), Sort.by("code").ascending(), CountryAreaDTO.class).stream().map(dto -> new CountryAreaCodeNameVO(dto.getCode(), dto.getName())).collect(Collectors.toList()));
    }

    /**
     * 根据市编码，查询区列表
     *
     * @param codeVO 接口参数
     * @return 查询结果
     */
    @Override
    public Wrapper<List<CountryAreaCodeNameVO>> listDistrictsByCityCode(CountryAreaCodeVO codeVO) {
        return Wrapper.success(countryAreaRepository.findByParentCode(codeVO.getCode(), Sort.by("code").ascending(), CountryAreaDTO.class).stream().map(dto -> new CountryAreaCodeNameVO(dto.getCode(), dto.getName())).collect(Collectors.toList()));
    }

    /**
     * 查询省列表（第一项为“所有”）
     *
     * @return 查询结果
     */
    @Override
    public Wrapper<List<CountryAreaCodeNameVO>> listAllProvince() {
        List<CountryAreaCodeNameVO> provinceList = countryAreaRepository.findByParentCode(ServiceConfig.COUNTRY_AREA_TOP_CODE, Sort.by("code").ascending()).stream().map(countryAreaDO -> new CountryAreaCodeNameVO(countryAreaDO.getCode(), countryAreaDO.getName())).collect(Collectors.toList());
        provinceList.add(0, new CountryAreaCodeNameVO(ServiceConfig.COUNTRY_AREA_TOP_CODE, MemberStringEnum.ALL.getName()));
        return Wrapper.success(provinceList);
    }

    /**
     * 根据省编码，查询市列表（第一项为“所有”）
     *
     * @param provinceCode 省编码
     * @return 查询结果
     */
    @Override
    public Wrapper<List<CountryAreaCodeNameVO>> listAllCitiesByProvinceCode(String provinceCode) {
        if(provinceCode.equals(ServiceConfig.COUNTRY_AREA_TOP_CODE)) {
            return Wrapper.success(Stream.of(new CountryAreaCodeNameVO("", MemberStringEnum.ALL.getName())).collect(Collectors.toList()));
        }

        List<CountryAreaCodeNameVO> cityList = countryAreaRepository.findByParentCode(provinceCode, Sort.by("code").ascending()).stream().map(countryAreaDO -> new CountryAreaCodeNameVO(countryAreaDO.getCode(), countryAreaDO.getName())).collect(Collectors.toList());
        cityList.add(0, new CountryAreaCodeNameVO("", MemberStringEnum.ALL.getName()));
        return Wrapper.success(cityList);
    }
}
